home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / GadUtil / Examples / MoreExamples-C / demo.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  12KB  |  385 lines

  1. /*------------------------------------------------------------------------**
  2. **           project: gadutil.library example demo                        **
  3. **            author: Lukasz Szelag                                       **
  4. **            e-mail: luk@i17linuxa.ists.pwr.wroc.pl                      **
  5. **               WWW: http://www.pwr.wroc.pl/amiga/amiuser/luk            **
  6. **               IRC: #amigapl (Luk)                                      **
  7. **                                                                        **
  8. ** Compile with SAS/C 6.x:                                                **
  9. **        sc Demo.c                                                       **
  10. **        slink lib:c.o Demo.o to Demo LIB lib:sc.lib lib:amiga.lib       **
  11. **------------------------------------------------------------------------*/
  12.  
  13. /*------------------------------------------------------------------------**
  14. Since every C program usually has header files included, so we here include
  15. needed files to satisfy our compiler !
  16. **------------------------------------------------------------------------*/
  17.  
  18. #include <proto/exec.h>
  19. #include <proto/intuition.h>
  20. #include <intuition/gadgetclass.h>
  21. #include <proto/gadtools.h>
  22. #include <proto/gadutil.h>                    /* the name of the game !      */
  23.  
  24. /*------------------------------------------------------------------------**
  25. It's  very useful to define absolute gadget's position in the window. Note:
  26. it's only for the first gadget - other gadgets may be positioned relatively
  27. each  to other. Also these values are used to compute the right size of the
  28. window  (see  tags WA_InnerWidth and WA_InnerHeight). It means that gadutil
  29. will compute for you the final size of the window !
  30. **------------------------------------------------------------------------*/
  31.  
  32. #define LEFT_OFFSET 10
  33. #define TOP_OFFSET  10
  34.  
  35. /* standard gadtools underscore tags */
  36. struct TagItem GT_tags[] =
  37. {
  38.   GT_Underscore, '_',
  39.   TAG_DONE
  40. };
  41.  
  42. /*------------------------------------------------------------------------**
  43. The  following  variables  will  be  further  filled  by  gadutil  internal
  44. routines. Aren't ya familar with these yet ? Just refer to gadutil autodocs
  45. and it'll becomes clear at once !
  46. **------------------------------------------------------------------------*/
  47. LONG farright, farbottom, gad_IDCMP;
  48.  
  49. struct TagItem global_tags[] =
  50. {
  51.   GU_RightExtreme, (ULONG)&farright,
  52.   GU_LowerExtreme, (ULONG)&farbottom,
  53.   GU_MinimumIDCMP, (ULONG)&gad_IDCMP,
  54.   TAG_DONE
  55. };
  56.  
  57. /*------------------------------------------------------------------------**
  58. Here  we've  some hot image data for the IMAGE_KIND gadget - unselected and
  59. selected images !
  60. **------------------------------------------------------------------------*/
  61.  
  62. static UWORD __chip image1_data[60] =
  63. {
  64.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3C1F, 0xC1E0, 0x780F,
  65.   0x80F0, 0x780F, 0x80F0, 0xF9CF, 0x9CF8, 0xFDDD, 0xDDF8, 0xFFF8, 0xFFF8,
  66.   0x7FF8, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FE0, 0x3F80, 0x03FF,
  67.   0xFE00, 0x007F, 0xF000,
  68.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3FFF, 0xFFE0, 0x7FFF,
  69.   0xFFF0, 0x7FFF, 0xFFF0, 0xFE3F, 0xE3F8, 0xFE3F, 0xE3F8, 0xFFFF, 0xFFF8,
  70.   0x7FFF, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FFF, 0xFF80, 0x03FF,
  71.   0xFE00, 0x007F, 0xF000
  72. };
  73.  
  74. static UWORD __chip image2_data[60] =
  75. {
  76.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3C1F, 0xC1E0, 0x78EF,
  77.   0x8EF0, 0x78EF, 0x8EF0, 0xF80F, 0x80F8, 0xFC1D, 0xC1F8, 0xFFF8, 0xFFF8,
  78.   0x7FF8, 0xFFF0, 0x7FFF, 0xFFF0, 0x3F9F, 0xCFE0, 0x0FC0, 0x1F80, 0x03FF,
  79.   0xFE00, 0x007F, 0xF000,
  80.   0x007F, 0xF000, 0x03FF, 0xFE00, 0x0FFF, 0xFF80, 0x3FFF, 0xFFE0, 0x7F1F,
  81.   0xF1F0, 0x7F1F, 0xF1F0, 0xFFFF, 0xFFF8, 0xFFFF, 0xFFF8, 0xFFFF, 0xFFF8,
  82.   0x7FFF, 0xFFF0, 0x7FFF, 0xFFF0, 0x3FFF, 0xFFE0, 0x0FFF, 0xFF80, 0x03FF,
  83.   0xFE00, 0x007F, 0xF000
  84. };
  85.  
  86.  
  87. struct Image image1 = {0, 0, 29, 15, 2, image1_data, 0x03, 0x00, NULL};
  88. struct Image image2 = {0, 0, 29, 15, 2, image2_data, 0x03, 0x00, NULL};
  89.  
  90. /*------------------------------------------------------------------------**
  91. Here we can define all gadgets ! It's very simple task - you don't need any
  92. GUI  editor  since  gadget's  positions may be specified relatively each to
  93. other !
  94. **------------------------------------------------------------------------*/
  95.  
  96. /* gadget's names */
  97. #define GDG_BOX1     0
  98. #define GDG_BOX2     1
  99. #define GDG_BOX3     2
  100. #define GDG_BOX4     3
  101. #define GDG_BOX5     4
  102. #define GDG_BOX6     5
  103. #define GDG_DRAWER   6
  104. #define GDG_FILE     7
  105. #define GDG_PROGRESS 8
  106. #define GDG_IMAGE    9
  107.  
  108. struct TagItem box1[] =
  109. {
  110.   GU_GadgetKind,  BEVELBOX_KIND,
  111.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_RIDGE",
  112.   GUBB_Recessed,  TRUE,
  113.   GUBB_FrameType, BFT_RIDGE,
  114.   GUBB_TextColor, 2,
  115.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  116.   GUBB_3DText,    TRUE,
  117.   GU_Left,        LEFT_OFFSET,
  118.   GU_Top,         TOP_OFFSET,
  119.   GU_Width,       300,
  120.   GU_Height,      30,
  121.   TAG_DONE
  122. };
  123.  
  124. struct TagItem box2[] =
  125. {
  126.   GU_GadgetKind,  BEVELBOX_KIND,
  127.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_RIDGE",
  128.   GUBB_Recessed,  TRUE,
  129.   GUBB_FrameType, BFT_RIDGE,
  130.   GUBB_TextColor, 2,
  131.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  132.   GU_LeftRel,     GDG_BOX1,
  133.   GU_AlignTop,    GDG_BOX1,
  134.   GU_DupeWidth,   GDG_BOX1,
  135.   GU_DupeHeight,  GDG_BOX1,
  136.   TAG_DONE
  137. };
  138.  
  139. struct TagItem box3[] =
  140. {
  141.   GU_GadgetKind,  BEVELBOX_KIND,
  142.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_BUTTON",
  143.   GUBB_Recessed,  TRUE,
  144.   GUBB_FrameType, BFT_BUTTON,
  145.   GUBB_TextColor, 2,
  146.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  147.   GUBB_3DText,    TRUE,
  148.   GU_AlignLeft,   GDG_BOX1,
  149.   GU_TopRel,      GDG_BOX1,
  150.   GU_AddTop,      10,
  151.   GU_DupeWidth,   GDG_BOX1,
  152.   GU_DupeHeight,  GDG_BOX1,
  153.   TAG_DONE
  154. };
  155.  
  156. struct TagItem box4[] =
  157. {
  158.   GU_GadgetKind,  BEVELBOX_KIND,
  159.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_BUTTON",
  160.   GUBB_Recessed,  TRUE,
  161.   GUBB_FrameType, BFT_BUTTON,
  162.   GUBB_TextColor, 2,
  163.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  164.   GU_LeftRel,     GDG_BOX3,
  165.   GU_AlignTop,    GDG_BOX3,
  166.   GU_DupeWidth,   GDG_BOX1,
  167.   GU_DupeHeight,  GDG_BOX1,
  168.   TAG_DONE
  169. };
  170.  
  171. struct TagItem box5[] =
  172. {
  173.   GU_GadgetKind,  BEVELBOX_KIND,
  174.   GU_GadgetText,  (ULONG)"Recessed3D FrameType = BFT_DROPBOX",
  175.   GUBB_Recessed,  TRUE,
  176.   GUBB_FrameType, BFT_DROPBOX,
  177.   GUBB_TextColor, 2,
  178.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT|BB_SUNAT_UL,
  179.   GUBB_3DText,    TRUE,
  180.   GU_AlignLeft,   GDG_BOX1,
  181.   GU_TopRel,      GDG_BOX4,
  182.   GU_AddTop,      10,
  183.   GU_DupeWidth,   GDG_BOX1,
  184.   GU_DupeHeight,  GDG_BOX1,
  185.   TAG_DONE
  186. };
  187.  
  188. struct TagItem box6[] =
  189. {
  190.   GU_GadgetKind,  BEVELBOX_KIND,
  191.   GU_GadgetText,  (ULONG)"Recessed FrameType = BFT_DROPBOX",
  192.   GUBB_Recessed,  TRUE,
  193.   GUBB_FrameType, BFT_DROPBOX,
  194.   GUBB_TextColor, 2,
  195.   GUBB_Flags,     BB_TEXT_ABOVE_LEFT,
  196.   GU_LeftRel,     GDG_BOX5,
  197.   GU_AlignTop,    GDG_BOX5,
  198.   GU_DupeWidth,   GDG_BOX1,
  199.   GU_DupeHeight,  GDG_BOX1,
  200.   TAG_DONE
  201. };
  202.  
  203. struct TagItem drawer[] =
  204. {
  205.   GU_GadgetKind,  DRAWER_KIND,
  206.   GU_GadgetText,  (ULONG)"_DRAWER KIND:",
  207.   GU_Flags,       NG_HIGHLABEL,
  208.   GU_LabelHotkey, TRUE,
  209.   GU_AlignLeft,   GDG_BOX1,
  210.   GU_AdjustLeft,  10,
  211.   GU_TopRel,      GDG_BOX5,
  212.   GU_AddTop,      5,
  213.   GU_Width,       DRAWERKIND_WIDTH,
  214.   GU_Height,      DRAWERKIND_HEIGHT,
  215.   TAG_DONE
  216. };
  217.  
  218. struct TagItem file[] =
  219. {
  220.   GU_GadgetKind,  FILE_KIND,
  221.   GU_GadgetText,  (ULONG)"_FILE KIND:",
  222.   GU_Flags,       NG_HIGHLABEL,
  223.   GU_LabelHotkey, TRUE,
  224.   GU_AlignLeft,   GDG_DRAWER,
  225.   GU_TopRel,      GDG_DRAWER,
  226.   GU_AddTop,      5,
  227.   GU_Width,       FILEKIND_WIDTH,
  228.   GU_Height,      FILEKIND_HEIGHT,
  229.   TAG_DONE
  230. };
  231.  
  232. struct TagItem progress[] =
  233. {
  234.   GU_GadgetKind,  PROGRESS_KIND,
  235.   GU_GadgetText,  (ULONG)"PROGRESS KIND:",
  236.   GUPR_Current,   30,
  237.   GUPR_Total,     100,
  238.   GU_Flags,       NG_HIGHLABEL,
  239.   GU_LeftRel,     GDG_DRAWER,
  240.   GU_AdjustLeft,  10,
  241.   GU_AlignTop,    GDG_DRAWER,
  242.   GU_Width,       100,
  243.   GU_DupeHeight,  GDG_DRAWER,
  244.   TAG_DONE
  245. };
  246.  
  247. struct TagItem image[] =
  248. {
  249.   GU_GadgetKind,   IMAGE_KIND,
  250.   GU_GadgetText,   (ULONG)"_IMAGE KIND:",
  251.   GUIM_Image,      (ULONG)&image1,
  252.   GUIM_SelectImg,  (ULONG)&image2,
  253.   GU_Flags,        NG_HIGHLABEL,
  254.   GU_LabelHotkey,  TRUE,
  255.   GU_LeftRel,      GDG_PROGRESS,
  256.   GU_AdjustLeft,   10,
  257.   GU_AlignTop,     GDG_PROGRESS,
  258.   GU_Width,        29+10,
  259.   GU_Height,       15+5,
  260.   TAG_DONE
  261. };
  262.  
  263. struct LayoutGadget gadgets[] =
  264. {
  265.   GDG_BOX1,     box1,     NULL,    NULL,
  266.   GDG_BOX2,     box2,     NULL,    NULL,
  267.   GDG_BOX3,     box3,     NULL,    NULL,
  268.   GDG_BOX4,     box4,     NULL,    NULL,
  269.   GDG_BOX5,     box5,     NULL,    NULL,
  270.   GDG_BOX6,     box6,     NULL,    NULL,
  271.   GDG_DRAWER,   drawer,   GT_tags, NULL,
  272.   GDG_FILE,     file,     GT_tags, NULL,
  273.   GDG_PROGRESS, progress, NULL,    NULL,
  274.   GDG_IMAGE,    image,    GT_tags, NULL,
  275.   -1
  276. };
  277.  
  278. /*------------------------------------------------------------------------*/
  279. struct Library *GadUtilBase = NULL;            /* library base                  */
  280. struct Screen *myscreen = NULL;                /* our screen                  */
  281. struct Window *mywindow     = NULL;            /* and its visitor window      */
  282.  
  283. APTR ginfo;                                    /* gadget's stuff              */
  284. struct Gadget *glist;
  285. UWORD sel_gadID;                            /* number of the selected gadget */
  286.  
  287. struct IntuiMessage *imsg;                    /* IntuiMessage stuff          */
  288. ULONG class;
  289. UWORD code;
  290. APTR iaddress;
  291.  
  292. BOOL done = FALSE;                            /* program termination flag      */
  293.  
  294. /*------------------------------------------------------------------------*/
  295. void main(void)
  296. {
  297.     /* let's open the famous library :-) */
  298.     if (GadUtilBase = OpenLibrary(GADUTILNAME, 36))
  299.     {
  300.         /* let's get pointer to the default public screen */
  301.         if (myscreen = LockPubScreen(NULL))
  302.         {
  303.             /* let's initialize our pretty gadgets */
  304.             if (ginfo = GU_LayoutGadgetsA(&glist, gadgets, myscreen, global_tags))
  305.             {
  306.                 /* I think it'd be great to have one small cute window ! */
  307.                 if (mywindow = OpenWindowTags(
  308.                     NULL,
  309.                     WA_Left,            5,
  310.                     WA_Top,                20,
  311.                     WA_InnerWidth,        farright+LEFT_OFFSET,
  312.                     WA_InnerHeight,        farbottom+TOP_OFFSET,
  313.                     WA_PubScreenName,    NULL,
  314.                     WA_IDCMP,            gad_IDCMP|
  315.                                         IDCMP_CLOSEWINDOW|
  316.                                         IDCMP_VANILLAKEY,
  317.                     WA_Flags,            WFLG_DRAGBAR|
  318.                                         WFLG_DEPTHGADGET|
  319.                                         WFLG_CLOSEGADGET|
  320.                                         WFLG_SMART_REFRESH|
  321.                                         WFLG_ACTIVATE|
  322.                                         WFLG_RMBTRAP,
  323.                     WA_Gadgets,            glist,
  324.                     WA_Title,            (ULONG)"Yeah, it tastes well, doesn't ?!",
  325.                     TAG_DONE))
  326.                 {
  327.                     /* Hmm, our pretties need to be refreshed... */
  328.                     GU_RefreshWindow(mywindow, ginfo);
  329.  
  330.                     DrawImage(mywindow->RPort, &image1, 50, 70);
  331.                     DrawImage(mywindow->RPort, &image2, 50, 110);
  332.  
  333.                     /* As ya may see program will terminate if our boolean become TRUE ! */
  334.                     while (!done)
  335.                     {
  336.                         /* Waitin' for messages - is it heavy work ? */
  337.                         Wait(1L << mywindow->UserPort->mp_SigBit);
  338.  
  339.                         /* let's process our messages */
  340.                         while (imsg = GU_GetIMsg(mywindow->UserPort))
  341.                         {
  342.                             /* Let's store every message and reply as fast as we can ! */
  343.                             class    = imsg->Class;
  344.                             code     = imsg->Code;
  345.                             iaddress = imsg->IAddress;
  346.                             GU_ReplyIMsg(imsg);
  347.  
  348.                             /* Let's  take  a brave decission and branch out (standard IDCMP handling). */
  349.                             switch (class)
  350.                             {
  351.                                 /* DRAWER_KIND, FILE_KIND or IMAGE_KIND */
  352.                                 case IDCMP_GADGETUP:
  353.  
  354.                                 /* number of the selected gadget */
  355.                                 sel_gadID = ((struct Gadget *)iaddress)->GadgetID;
  356.  
  357.                                 switch (sel_gadID)
  358.                                 {
  359.                                     case GDG_DRAWER:
  360.                                     case GDG_FILE:
  361.                                     case GDG_IMAGE:
  362.                                     DisplayBeep(myscreen); break;
  363.                                 }
  364.                                 break;
  365.  
  366.                                 /* both close window and Esc key will cause quit */
  367.                                 case IDCMP_CLOSEWINDOW: done = TRUE; break;
  368.                                 case IDCMP_VANILLAKEY:  done = (code==27); break;
  369.                             }
  370.                         }
  371.                     }
  372.                     /* Bye, bye dear window ! */
  373.                     CloseWindow(mywindow);
  374.                 }
  375.                 /* Bye for now, pretty gadgets ! */
  376.                 GU_FreeLayoutGadgets(ginfo);
  377.             }
  378.             /* Accordin' to the RKM we may unlock our screen now ! */
  379.             UnlockPubScreen(NULL, myscreen);
  380.         }
  381.         /* Sorry, accordin' to the RKM I... have to close ya :( */
  382.         CloseLibrary(GadUtilBase);
  383.     }
  384. }
  385.